package com.olda.play.system.biz.impl;

import cn.hutool.core.bean.BeanUtil;
import com.olda.play.enums.ConstantEnum;
import com.olda.play.system.biz.SysMenuBizService;
import com.olda.play.system.biz.SysRoleBizService;
import com.olda.play.system.biz.dao.SysMenuBizMapper;
import com.olda.play.system.dto.SysMenuDto;
import com.olda.play.system.model.dao.SysMenuMapper;
import com.olda.play.system.model.po.SysMenu;
import com.olda.play.system.model.po.SysMenuExample;
import com.olda.play.system.model.po.SysRoleMenu;
import com.olda.play.system.util.SysUtils;
import com.olda.play.system.vo.SysMenuVo;
import com.olda.play.utils.UserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 */
@Service
public class SysMenuBizServiceImpl implements SysMenuBizService {
    @Autowired
    private SysMenuMapper sysMenuMapper;
    @Autowired
    private SysMenuBizMapper sysMenuBizMapper;
    @Autowired
    private SysRoleBizService sysRoleBizService;

    /**
     * 根据条件查询菜单信息
     * @param param
     * @return
     */
    @Override
    public List<SysMenuDto> querySysMenuList(SysMenuVo param) {
        Map<String,Object> map= BeanUtil.copyProperties(param, Map.class);
        List<SysMenuDto> list=sysMenuBizMapper.selectByCondition(map);
        return list;
    }

    /**
     * 根据id查询菜单信息
     * @param id
     * @return
     */
    @Override
    public SysMenu selectSysMenuById(Long id) {
        return sysMenuMapper.selectByPrimaryKey(id);
    }
    /**
     * 根据id删除菜单层级信息
     * @param id
     */
    @Override
    public void deleteSysMenuById(Long id) {
        //删除菜单
        sysMenuMapper.deleteByPrimaryKey(id);
        //删除角色-菜单关联关系
        sysRoleBizService.deleteRoleMenuById(id,1);
    }
    /**
     * 根据名称查询菜单信息
     * @param name
     * @return
     */
    @Override
    public SysMenu selectSysMenuByName(String name) {
        SysMenuExample example=new SysMenuExample();
        SysMenuExample.Criteria criteria=example.createCriteria();
        criteria.andNameEqualTo(name);

        List<SysMenu> list=sysMenuMapper.selectByExample(example);

        return list.size()>0?list.get(0):null;
    }

    /**
     * 新增一个菜单信息
     * @param sysMenu
     */
    @Override
    public void save(SysMenu sysMenu) {
        sysMenu.setCreateTime(new Date());
        sysMenu.setCreateUser(UserUtils.getUserId().toString());
        sysMenu.setCreateUserName(UserUtils.getUsername());
        sysMenu.setIsDeleted(ConstantEnum.IS_DELETE_NO.getCode());
        sysMenu.setPlatform(ConstantEnum.PLATEFORM_0.getCode());
        sysMenuMapper.insert(sysMenu);
    }
    /**
     * 更新菜单信息
     * @param sysMenu
     */
    @Override
    public void updateSysMenu(SysMenu sysMenu) {

        sysMenu.setModifyTime(new Date());
        sysMenu.setModifyUser(UserUtils.getUserId().toString());
        sysMenu.setModifyUserName(UserUtils.getUsername());
        sysMenuMapper.updateByPrimaryKeySelective(sysMenu);
    }

    /**
     * 用户登录成功后获取其菜单结构
     * @return
     */
    @Override
    public List<SysMenuDto> getUserRoleMenuList(SysMenuVo param) {
        Long roleId=UserUtils.getRoleId();
        if(roleId==null){
            return new ArrayList<>();
        }
        List<SysRoleMenu> sysRoleMenus=sysRoleBizService.getSysSysRoleMenu(roleId,1);
        if(sysRoleMenus.size()==0){
            return new ArrayList<>();
        }
        List<Long> menuIds=sysRoleMenus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
        param.setMenuIds(menuIds);
        //先查询目录和菜单数据
        List<SysMenuDto> list=querySysMenuList(param);
        List<SysMenuDto> listRt=SysUtils.generateRecurMenus(list);
        if(listRt.size()>0){
            //加载权限
            list.forEach(item ->{
                List<SysMenuDto> child=item.getChildren();
                child.forEach(itemChild ->{
                    List<String> permList=getMenuPerm(itemChild.getId());
                    itemChild.setPermList(permList);
                });
            });
        }
        return listRt;
    }

    /**
     * 获取用户某个菜单下的权限数据
     * @param id
     * @return
     */
    private List<String> getMenuPerm(Long id) {
        SysMenuExample example=new SysMenuExample();
        SysMenuExample.Criteria criteria=example.createCriteria();
        criteria.andParentIdEqualTo(id);
        criteria.andTypeEqualTo(2);
        List<SysMenu> list=sysMenuMapper.selectByExample(example);
        if(list.size()==0){
            return new ArrayList<>();
        }

        return list.stream().map(SysMenu::getPerms).collect(Collectors.toList());
    }
}
